package com.drakulo.hi.gfx;

import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.UnicodeFont;

import com.dk.hi.core.actor.Lineament;
import com.drakulo.hi.logic.actors.Hero;
import com.drakulo.hi.logic.inventory.Inventory;

/**
 * Classe de rendu d'un héros dans le panneau d'inventaire / statut
 */
public abstract class InventoryPanelHeroGfx {
	/**
	 * Coordonnée en Y du composant portrait
	 */
	private static final int FACE_Y = 0;

	/**
	 * Coordonnée en Y du composant jauge
	 */
	private static final int GAUGES_Y = 96;

	/**
	 * Coordonnée en Y des traits
	 */
	private static final int LINEAMENTS_Y = 150;

	/**
	 * Coordonnée en Y du composant equipement
	 */
	public static final int EQUIPMENT_Y = 270;

	/**
	 * Coordonnée en Y du composant inventaire
	 */
	public static final int INVENTORY_Y = 420;

	/**
	 * Largeur d'un panneau de personnage
	 */
	private static final int SUBPANEL_WIDTH = 162;

	/**
	 * Génère le rendu d'un héros dans le panneau d'inventaire / statut
	 * 
	 * @param g
	 *            - le canevas sur lequel dessiner
	 * @param h
	 *            - le héros
	 * @param x
	 *            - l'origine en X
	 * @throws SlickException
	 */
	public static void render(Graphics g, Hero h, int x) throws SlickException {
		// Dans l'ordre de haut en bas on retrouve :
		// 1. Le portrait du héros
		renderFace(g, h, x);

		// 2. Ses jauges de points de vie / points de mana
		renderGauges(g, h, x);

		// 3. Ses traits
		renderLineaments(g, h, x);

		// 4. L'équipement qu'il porte
		EquipmentGfx.render(g, h);

		// 5. Le contenu de son inventaire
		renderInventory(g, h, x);
	}

	/**
	 * Génère le rendu du portrait du héros
	 * 
	 * @param g
	 *            - le canevas sur lequel dessiner
	 * @param h
	 *            - le héros
	 * @param x
	 *            - l'origine en X
	 * @throws SlickException
	 */
	private static void renderFace(Graphics g, Hero h, int x) throws SlickException {
		int faceX = x + (SUBPANEL_WIDTH / 2 - Face.SIZE / 2);
		h.getFace().draw(faceX, FACE_Y);

		g.setColor(Color.white);
		g.drawRect(faceX, 0, 96, 96);
	}

	/**
	 * Génère le rendu des jauges de vie et de magie du héros
	 * 
	 * @param g
	 *            - le canevas sur lequel dessiner
	 * @param h
	 *            - le héros
	 * @param x
	 *            - l'origine en X
	 * @throws SlickException
	 */
	private static void renderGauges(Graphics g, Hero h, int x) throws SlickException {
		// Cadre autour des barres de vie / magie
		g.setColor(Color.white);
		g.drawRect(x, GAUGES_Y, SUBPANEL_WIDTH, 50);

		Gauge lifeGauge = h.getLifeGauge();
		lifeGauge.setWidth(SUBPANEL_WIDTH);
		lifeGauge.render(g, x, GAUGES_Y);

		Gauge spellGauge = h.getSpellGauge();
		spellGauge.setWidth(SUBPANEL_WIDTH);
		spellGauge.render(g, x, GAUGES_Y + 25);
	}

	/**
	 * Génère le rendu de l'inventaire du héros
	 * 
	 * @param g
	 *            - le canevas sur lequel dessiner
	 * @param h
	 *            - le héros
	 * @param x
	 *            - l'origine en X
	 * @throws SlickException
	 */
	private static void renderInventory(Graphics g, Hero h, int x) throws SlickException {
		int renderX = x + (SUBPANEL_WIDTH / 2 - (Inventory.COLS * Item.SPRITE_SIZE) / 2);
		InventoryGfx.render(g, h.getInventory(), renderX, INVENTORY_Y);
	}

	/**
	 * Génère le rendu d'un trait du héros
	 * 
	 * @param l
	 *            - le trait
	 * @param v
	 *            - sa valeur
	 * @param x
	 *            - la coordonnée en X
	 * @param y
	 *            - la coordonnée en Y
	 * @throws SlickException
	 */
	private static void renderLineament(Lineament l, Integer v, int x, int y) throws SlickException {
		int deltaX = 0;
		if (v < 99 && v > 9) {
			deltaX = 135;
		} else if (v > 99) {
			deltaX = 125;
		} else {
			deltaX = 145;
		}
		UnicodeFont font = FontFactory.getGaugeFont();
		font.drawString(x + 5, y, l.getText());
		font.drawString(x + deltaX, y, v.toString());
	}

	/**
	 * Génère le rendu des traits du héros
	 * 
	 * @param g
	 *            - le canevas sur lequel dessiner
	 * @param h
	 *            - le héros
	 * @param x
	 *            - l'origine en X
	 * @throws SlickException
	 */
	private static void renderLineaments(Graphics g, Hero h, int x) throws SlickException {
		// Map<Lineament, Integer> lineaments = h.getLineaments();
		//
		// int y = LINEAMENTS_Y;
		// renderLineament(Lineament.STRENGTH,
		// lineaments.get(Lineament.STRENGTH), x, y);
		// y += 25;
		// renderLineament(Lineament.INTELLIGENCE,
		// lineaments.get(Lineament.INTELLIGENCE), x, y);
		// y += 25;
		// renderLineament(Lineament.AGILITY, lineaments.get(Lineament.AGILITY),
		// x, y);
		// y += 25;
		// renderLineament(Lineament.WISDOM, lineaments.get(Lineament.WISDOM),
		// x, y);
		//
		// // Cadre autour des traits
		// g.setColor(Color.white);
		// g.drawRect(x, 150, SUBPANEL_WIDTH, 100);
	}
}
